#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
//int addtotarget(int from, int to)
//{
//    int sum=0;
//    for(int i = from; i < to; i++)
//    {
//        sum+=i;
//    }
//    // exit(111); // 库函数
//    // _exit(111); // 系统调用
//    // return sum;
//}
int main()
{
    pid_t id=fork();
    if(id==0)
    {
        // child process
        int cnt=5;
        while(cnt)
        {
            printf("我是子进程:%d，父进程:%d,cnt:%d\n",getpid(),getppid(),cnt--);
            sleep(1);
            //int*p=NULL;
            //*p=100;
            int a=10;
            a/=0;
        }
        exit(10);// 子进程退出，设置退出码为10
    }
    int status = 0;// 不能直接拿来使用，他有自己的位图结构
    pid_t ret=waitpid(id,&status,0);
    if(id >0)
    {
        printf("wait success:%d,sig number:%d,child exit code:%d\n",ret,(status & 0x7F),(status>>8)&0x7F);
        // status>>8 don't change status only >>=8 can change status.
         
    }
    sleep(5);// 让父进程先别退出，等待5秒





   // printf("hello Linux!");
   // sleep(3);
   // _exit(1);

    //printf("hello Linux\n");
  
    //addtotarget(1,100);

    //while(1) sleep(1);

    //for(int i = 0; i<200; i++)
    //{
    //    printf("%d-->  %s\n",i,strerror(i));
    //}


    // 写代码是为了完成某种任务，想要知道任务完成的如何
    // 通过进程退出码来判断
    //int num = addtotarget(1,100);
    //if(num==5050)
    //{
    //    return 0;
    //}
    //else 
    //{
    //    return 1;
    //}
    // 如果不关心进程的退出码，return 0就行
    // 如果关心进程的退出码，要返回特定的数据来表明特定的错误。


    // 0是进程退出时，对应的退出码，标定进程执行的结果是否正确   
    // return 0;
}
